﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using BIZMA._controls;
using BIZModel;
using BL.BIZControls;
using System.Configuration;
using System.Web.Security;
using System.Web.Configuration;

namespace BIZMA._controls.DemoProject
{
    public partial class Edit_ProjectTask : BIZEditControl, IBIZControlDefaultMethods
    {
        #region Default load functions
        public void DefaultListLoad()
        {
            throw new NotImplementedException();
        }

        public void DefaultListLoad(Guid Id, string loadByType)
        {
            throw new NotImplementedException();
        }

        public void DefaultEditNew()
        {
            throw new NotImplementedException();
        }
        /// <summary>
        /// Lägg till en ny uppgift till projekt
        /// </summary>
        /// <param name="Id">ProjectIdl</param>
        /// <param name="editByType">Typ av objekt id tillhör tex ObjectTypeProject == id är projectId</param>
        public void DefaultEditNew(Guid Id, string editByType)
        {
            if (editByType == ObjectTypeProject)
            {
                NewTask(Id);
            }
            else
                throw new NotImplementedException();
        }

        /// <summary>
        /// Ändra en befintlig uppgift
        /// </summary>
        /// <param name="Id">ProjectTaskId</param>
        public void DefaultEditLoad(Guid Id)
        {
            LoadTask(Id);
        }


        #endregion

        //Skapa objecttyper för att beskriva objekt i generella funktioner
        /// <summary>
        /// ObjectType för projekt används där typ av objekt ska beskrivas tex i generella metoder där bara ett id och objettype finns
        /// </summary>
        public const string ObjectTypeProject = "PROJECT";

        //Skapa eventtyper för att beskriva vilket event som sker i generella eventfunktioner
        ///// <summary>
        ///// EventType för knappen visa rättigheter
        ///// </summary>
        //public const string EventTypeOpenPermissions = "OPENPERMISSIONS";


        //Properties för att hålla reda på om en dialog kan öppnas eller om den redan är öppen i en underliggande dialog
        //public bool CanAddProjectDialog { get { return ViewState["CanAddProjectDialog"] != null ? (bool)ViewState["CanAddProjectDialog"] : true; } set { ViewState["CanAddProjectDialog"] = value; } }

        private Guid ProjectId { get { return ViewState["ProjectId"] != null ? (Guid)ViewState["ProjectId"] : Guid.Empty; } set { ViewState["ProjectId"] = value; } }


        #region Init
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack || !InitLoaded)
            {
                ApplySettings();
                //Gör sådant som man gör på pageload här typ fyll "statisk" dropdown med värden mm 
                //Väldigt ovanligt att man laddar listan härifrån då det oftast görs via en annan metod se public void LOAD_BY_SOMETHING_LIST(int someval)
            }

            //Vill man lyssna på specifika event från laddade kontroller ska det reggas här
            //OnInit sker innan så då är Container.ContainedControl alltid null eftersom kontrollerna i denna inte är laddade ännu
            //if (mcSOMESUBLIST.ContainedControl != null)
            //{
            //    ((BIZListControl)mcSOMESUBLIST.ContainedControl).ListSelect += new SelectedChanged(mcSOMESUBLIST_ListSelect);
            //}
        }


        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
            //här gör man alla init inställningar tex lägga till eventhandlers och annat som styr sidan
            if (ContainerControl != null)
            {
                //Titel på containerkontrollen
                ContainerControl.Title = "Administrera uppgift";
                //Event vid klick på knapparna i containerkontrollen
                ContainerControl.ButtonsClick += new ButtonsHandler(ContainerControl_ButtonsClick);
                //Vilka knappar den här kontrollen använder/vill visa från containerkontrollens knappar
                ContainerControl.ShowButtons(true, true, true, true);

                if (ModalContainerControl != null)
                {
                    ModalContainerControl.Width = 700;
                    ModalContainerControl.Height = 470;
                    ModalContainerControl.FormScrollStyleChanged += new EventHandler(ModalContainerControl_FormScrollStyleChanged);
                }

                //Sätt validation group från Containercontrollen så de blir unika på sidan
                valName.ValidationGroup = ContainerControl.ValGroupSave;
                valTime.ValidationGroup = ContainerControl.ValGroupSave;

                //Kontrollera om det går att öppna dialoger så det inte har blivit en loop av underliggande dialoger
                //Används i ToggleButtons()
                //CanAddProjectDialog = mcProjects.CanAddPopupControl(BIZControl.DEMOProjectList);
            }
            else
            {
                //Om det inte finns någon containercontrol

                //Validation groups för validatorer i kontrollen
                valName.ValidationGroup = "SAVE";
                valTime.ValidationGroup = "SAVE";
            }

            //Registrera event som sker i kontrollen
            //btnProjects.Command += new CommandEventHandler(btnProject_Command);
        }

        /// <summary>
        /// Utför ändringar i kontrollen utifrån de inställningar som gjorts från föälder till denna kontroll
        /// Funktionen körs automatiskt på onLoad om den inte körts innan
        /// Exempel på hur man använder
        /// Skapa ett event på att kontrollen laddas (men gör det i metoden där kontrollen läggs till eftersom du bara vill trigga detta en gång)
        /// mContainer.BIZControlLoaded += new ControlLoaded(mContainer_BIZControlLoaded);
        /// mContainer.DefaultEditLoad(BIZControl.Employee, EmployeeId);
        /// 
        /// Gör lite inställningar på kontrollen tex:
        /// ((CAST_TO_TYPE)mContainer.ContainedControl).SOME_PROPERTY = SOME_VALUE;
        /// ((CAST_TO_TYPE)mContainer.ContainedControl).ApplySettings();
        /// </summary>
        public void ApplySettings()
        {
            //Gör sådant som man gör på pageload här typ fyll "statisk" dropdown med värden mm 
            //Om tabbar används i kontrollen
            //SetTabSize = true; 
            InitLoaded = true;
        }


        #endregion
        #region Container Events
        void ModalContainerControl_FormScrollStyleChanged(object sender, EventArgs e)
        {
            //Sätter samma style (storlek) på FormPart som formscroll så den fyller hela ytan
            oneFormpart.Attributes["style"] = formscroll.Attributes["style"];
        }

        /// <summary>
        /// Triggas vid klick på någon av containerkontrollens knappar
        /// </summary>
        /// <param name="sender">Containerkontrollen</param>
        /// <param name="actionType">Vilken typ av knapp som klickats</param>
        void ContainerControl_ButtonsClick(object sender, ActionType actionType)
        {
            if (actionType == ActionType.Save || actionType == ActionType.SaveClose)
            {
                Save();
            }
            else if (actionType == ActionType.Delete)
            {
                Delete();
            }
        }


        #endregion

        #region Events This Control

        //void btnProject_Command(object sender, CommandEventArgs e)
        //{
        //    if (HandleButtonClick)
        //    {
        //        CallHandledButtonClick(this, CurrentId, ObjectTypeCustomer, EventTypeOpenPermissions);
        //    }
        //    else
        //    {
        //        mcProjects.AddDefaultListLoad(BIZControl.DEMOProjectList, CurrentId, List_Projects.ObjectTypeCustomer);
        //    }
        //}
        #endregion

        #region Methods this dialog



        /// <summary>
        /// Aktiverar/inaktiverar knappar som behöver data eller som inte kan visas pga underliggande dialoger 
        /// </summary>
        private void ToggleButtons()
        {
            ////Sätt status om knappen kan visas pga underliggande dialoger
            //BaseBL.BtnOpenEnabled(btnProjects, CanAddProjectDialog, ViewState);

            ////Sätt status om knappen kan visas pga data som krävs
            //if (CurrentId != Guid.Empty)
            //{
            //    if (CanAddProjectDialog)
            //    {
            //        BaseBL.BtnNeedsDataEnabled(btnProjects, true, ViewState);
            //    }
            //}
            //else
            //{
            //    if (CanAddProjectDialog)
            //    {
            //        BaseBL.BtnNeedsDataEnabled(btnProjects, false, ViewState);
            //    }
            //}
        }



        /// <summary>
        /// Kör denna metod när en ny kund ska skapas
        /// </summary>
        public void NewTask(Guid projectId)
        {
            ProjectId = projectId;
            LoadTask(Guid.Empty);
        }

        /// <summary>
        /// Kör denna metod när en kund ska ändras/visas
        /// </summary>
        /// <param name="customerId">Kunden som ska laddas</param>
        public void LoadTask(Guid customerId)
        {
            InitLoaded = true;
            CurrentId = customerId;


            if (CurrentId != Guid.Empty)
            {

                BIZMAEntities ent = BaseBL.GetEnt();
                BIZModel.ProjectTask task = ent.ProjectTasks.FirstOrDefault(q => q.ProjecTasktId == CurrentId);

                ProjectId = task.ProjectId;
                txtName.Text = task.Name;
                txtDescription.Text = task.Description;
                txtDeadLine.Text = task.DeadLine != null ? task.DeadLine.Value.ToShortDateString() : "";
                txtTag.Text = task.Tag;
                txtTime.Text = task.Time.ToString();
                selStatus.SelectedValue = task.Status;

            }
            else
            {
                if (ProjectId == Guid.Empty)
                {
                    throw new ArgumentException("ProjectId is required for adding a new project task!", "ProjectId");
                }

                txtName.Text = "";
                txtDescription.Text = "";
                txtDeadLine.Text = "";
                txtTag.Text = "";
                txtTime.Text = "";
                selStatus.ClearSelection();
            }

            ToggleButtons();
        }

        /// <summary>
        /// Spara
        /// </summary>
        private void Save()
        {
            //SAVE
            if (Page.IsValid)
            {

                BIZMAEntities ent = BaseBL.GetEnt();
                BIZModel.ProjectTask task = null;

                if (CurrentId == Guid.Empty)
                {
                    CurrentId = Guid.NewGuid();

                    task = BIZModel.ProjectTask.CreateProjectTask(CurrentId, ProjectId, txtName.Text, int.Parse(txtTime.Text), selStatus.SelectedValue);

                    DateTime dt;
                    task.Description = txtDescription.Text;
                    task.DeadLine = DateTime.TryParse(txtTime.Text, out dt) ? (DateTime?)dt : null;
                    task.Tag = txtTag.Text;

                    ent.ProjectTasks.AddObject(task);
                    ent.SaveChanges();
                }
                else
                {

                    task = ent.ProjectTasks.FirstOrDefault(q => q.ProjecTasktId == CurrentId);

                    DateTime dt;
                    task.Name = txtName.Text;
                    task.Description = txtDescription.Text;
                    task.DeadLine = DateTime.TryParse(txtTime.Text, out dt) ? (DateTime?)dt : null;
                    task.Tag = txtTag.Text;
                    task.Time = int.Parse(txtTime.Text);
                    task.Status = selStatus.SelectedValue;

                    ent.SaveChanges();
                }

                //Ändra aktivering av knappar efter sparning / eller kör load metoden 
                ToggleButtons();
            }
        }

        private void Delete()
        {
            if (CurrentId != Guid.Empty)
            {
                BIZMAEntities ent = BaseBL.GetEnt();
                BIZModel.ProjectTask task = ent.ProjectTasks.FirstOrDefault(q => q.ProjecTasktId == CurrentId);
                ent.DeleteObject(task);
                ent.SaveChanges();
            }

        }






        #endregion

        #region Sub dialog events

        #endregion




    }
}